package service

import (
	"github.com/gin-gonic/gin"
	"micro-store/dao"
	"micro-store/dto"
	"micro-store/util"
)

/**
 * @Description
 * @Date 2023/5/15 周一 16:17
 * @Author Tang-J-L <vx：17685112557>
 */

// CheckName 用户名重复检查
func CheckName(c *gin.Context) {
	var name dto.UserNameDto
	err := c.ShouldBindJSON(&name) // 将json参数绑定到User结构体
	if err != nil {                // 参数校验不通过
		util.Fail(c, util.GetValidMsg(err, &name))
		return
	}

	checkErr := dao.CheckUserName(name.UserName).Error
	if checkErr != nil {
		util.OK(c, name, "用户名可以使用！")
		return
	}
	util.Fail(c, "用户名已存在！")
}

// CreateUser 用户注册
func CreateUser(c *gin.Context) {
	var user dto.CreateUserDto

	err := c.ShouldBindJSON(&user) // 将json参数绑定到User结构体
	if err != nil {                // 参数校验不通过
		util.Fail(c, util.GetValidMsg(err, &user))
		return
	}

	// 密码确认
	if user.Password != user.ValidPassword {
		util.Fail(c, "两次密码输入与不一致！！！")
		return
	}

	// 注册
	CreatErr := dao.CreateUser(&user).Error
	if CreatErr != nil {
		util.Fail(c, "注册失败！！！")
		return
	}
	// 响应消息
	util.OK(c, user.UserName, "注册成功！！！")
}

// UserLogin 用户登录
func UserLogin(c *gin.Context) {
	var user dto.UserLoginDto

	err := c.ShouldBindJSON(&user) // 将json参数绑定到User结构体
	if err != nil {                // 参数校验不通过
		util.Fail(c, util.GetValidMsg(err, &user))
		return
	}

	loginInfo := dao.UserLogin(&user)
	if loginInfo.Error != nil {
		util.Fail(c, "用户信息有误！")
		return
	}

	token, err := util.GetToken(int(user.ID), user.UserName)
	if err != nil {
		util.Fail(c, "token生成失败！")
		return
	}

	userInfo := dto.LoginRes{
		ID:       user.ID,
		UserName: user.UserName,
		Token:    token,
	}
	util.OK(c, &userInfo, "登录成功！")
}

// GetUserList 查所有用户
func GetUserList(c *gin.Context) {
	list := dao.GetUserList()
	util.OK(c, &list, "查询成功！")
}

// UserUpdate 用户信息修改
func UserUpdate(c *gin.Context) {
	var user dto.UserUpdate

	err := c.ShouldBindJSON(&user) // 将json参数绑定到User结构体
	if err != nil {                // 参数校验不通过
		util.Fail(c, util.GetValidMsg(err, &user))
		return
	}

	err = dao.UserUpdate(&user).Error
	if err != nil {
		util.Fail(c, "修改失败！")
		return
	}

	util.OK(c, &user, "修改成功！")
}

// UserDelete 用户删除
func UserDelete(c *gin.Context) {
	var user dto.UserDelete
	err := c.ShouldBindJSON(&user) // 将json参数绑定到User结构体
	if err != nil {                // 参数校验不通过
		util.Fail(c, util.GetValidMsg(err, &user))
		return
	}
	err = dao.UserDelete(&user.ID).Error
	if err != nil {
		util.Fail(c, "删除失败！")
		return
	}

	util.OK(c, user.ID, "删除成功！")
}
